//
//  ReadMe.swift
//  CZ29VVeibo
//
//  Created by apple on 16/6/25.
//  Copyright © 2016年 apple. All rights reserved.
//

import Foundation

/*

    -第四天
    -OAuth open Auth  开发的授权
    - 为什么使用第三方登录
        - 方便（省去了注册一些信息）
        - 安全（用户不喜欢吧手机号提供给第三方app）
        - 开发第三方的微博app 
                - 使用微博的数据接口
        
    - 使用微博数据需要条件
        - open.weibo.com
        - 注册和登录 验证
        - 成为开发者 （个人和公司）
        - 创建应用
        - 设置回调页
        - 设置测试账号
        - 新浪微博返回的信息
                - APPKEY
                - APPSECRET
                - 自己设置好回调页
    - 开发者需要做的事情
        - 加载授权界面
        - 返回code码 
        - 通过code码 调取新浪微博获取access_token（访问令牌-相似我们userId） 借口获取相关数据
        - 得到access_token  就可以请求其他新浪微博借口数据



    -第五天
        - isLogin
        - accessToken
        - 如果判断用户是否登录
            - 未登录
                - 如果我的access_token 为nil
                - 如果我的access_token 有值 但是 过期了
            - 已登录
                - 我的access_token有值 而且没有过期
    

    - 前期回顾
        - OAuth授权
            - 加载授权界面
            - 通过webView 代理方法获取我们每次将要加载的请求
                - 如果他的前缀是我们回调页
                    - 截取code
            - 通过code 发送网络请求 获取 access_token exprix_in  uid
            - 通过 access_token 发送网络请求 获取个人信息数据（头像和昵称）
            - 保存用户信息 -> 归档
        - 开发欢迎界面
        - 判断用户是否登录
            - 如果用户的access_token 为nil --> 没有登录
            - 如果用户的access_token 不为nil 而且 没有过期  已经登录了 
            - 如果如果用户的access_token 不为nil 但是过期了 没有登录
        - 切换根控制器
            - OAuthVc & WelcomeVc  
                - OAuthVc 已经登录了 ---> 根控制器先为WelcomeVc 
                - WelcomeVc 当动画完成的时候 我们切换根控制器 为MainVc
        - 通过用户是否登录来决定我们的app的rootVc为谁
            - 如果登录rootVc ---> WelcomeVc --> MainVc
            - 如果没有登录MainVc -->OAuthVc-->WelcomeVc-->MainVc

        - 首页开发（列表显示）
            -布局问题
                - 原创微博
                - 转发微博（可能没有）
                - 底部toolbar
            -----> 最后组成一条完成cell
        - 封装问题
            - 网络请求（AFN）---> 单例封装  --> 吧我们项目中的所有请求都交给单例管理
                    - 控制器委托 NetworkTools 发送网络请求请求数据
            - 用户信息归档
                    - 控制器委托UserAccountTools 保存数据 获取数据 userAccount 
                    - 判断用户是否登录
                    - 给我们提供accessToken





    

    -第七天
        - 今日计划
        -1.	复杂的视图的实现方式和原则
        -2.	实现原创微博,绑定原创微博数据
        -3.	微博底部工具条的实现
        -4.	自动计算行高
        -5.	转发微博数据字典转模型
        -6.	实现被转发微博视图
        -7.	被转发微博视图绑定模型数据

        - 网络 HOMEVc
        - 放到数组中
        - 给tableView 
        - cell
        - 分别给原创微博 转发微博 底部toolbar

        - 判断是否有转发微博 
            - 如果retweeted_status == nil 没有转发微博
                - toolbar 的top == 原创微博的底部
            - 如果retweeted_status != nil 有转发微博
                - toolbar 的top == 转发微博的底部
        - 底部toolbar 显示的转发评论赞 格式----业务需求
            - 如果 count <= 0 
                    - 显示格式： 转发 评论 赞 文字
            - 如果 count > 0 && count < 10000
                    - 显示格式: 是多少显示多少 例如 8888  显示 8888
            - 如果 count >= 10000
                    - 显示格式: x.x 万  例如 12000  显示 1.2 万
                    -  例如 10000  显示 1万  20000  显示 2万 x万
    - 第七天内容回顾
        - 自动行高
        - CZUser 手动字典转模型
        - 原创微博赋值
        - 底部toolbar
        - 转发微博
        - 更改底部toolbar的顶部约束
                - 约束卸载 （当我们相对的对象发生改变的时候 我们需要卸载  然后可以使用make 和update 均可）
        - 转发评论赞
            - 一些逻辑问题  CGFloat 类型 CGFloat（x/1000）/10
    


    - 第八天
        - 微博时间业务逻辑需求
            - 如果是今年
                - 如果是今天
                    -  如果小于60秒 显示格式: 刚刚
                    -  如果 s>=60 && s < 60 * 60  显示格式:xx分钟前
                    -  如果 s>= 60*60  显示格式: xx小时前
                - 如果是昨天
                    -  2016-06-29 12:12:12  显示格式: 昨天 12:12
                - 如果是其他
                    -  2016-06-12 13:13:13  显示格式: 06月12日 13:13
            - 如果不是今年
                    - 2015-05-05 10:10:10 显示格式: 2015年05月05日 10:10

    - 第八天学习内容
        - 学习自定义控件 （配图视图collocationView）   ---- 原创微博& 转发微博
            - 外界给其设置数据 ---- 数组 --- 刷新  --- 配图显示
            - 注意问题
                    - 原创微博或者转发微博 是否有配图
                            - 如果没有配图 --> 原创微博&转发微博的bottom == contentLabel.bottom
                            - 如果有配图  --> 原创微博&转发微博的bottom  == 配图的.bottom
                            - 卸载约束
                            - 由于cell 复用机制 考虑 隐藏或者显示配图
            - 微博来源字符串截取 String 字符串截取    
                    - 服务器返回来的数据 可能有可能没有
                    - 先判断他是否为nil 且包含我们认为肯定存在的字符串
                    - startIndex & endIndex
                    - 完成字符串的截取
                    - 富文本 可以改变字符串的 字体 颜色 背景色 ...
            - 微博时间格式化
                    - NSDateformat 
                    - 日历类
    - 第九天
        - 自定义下拉刷新控件分析
            - 该控件继承谁 - UIControl
            - 该控件贴在谁身上 tableView
            - 该控件Y轴 == -控件的高度
        -分析状态
            - 如果用户在拖动tableView 没有松手
                - 正常 contentOffSet.y > -114 && 当前状态为下拉中
                - 下拉中 contentOffSet.y <= -114 &&当前状态为正常
            - 如果用户停止拖动 而且松手 而且控件的状态为下拉中
                - 刷新中



    - 第十三天 
            - 表情键盘删除按钮事件
            - Emoji表情上屏
            - 学习NSTextAttachment(文本附件)
            - 图片表情上屏
            - 发送文字微博
            - 发送文字+图片微博
            - 发送图片表情文字微博
            - 使用正则匹配图片表情(RegexKitLite)
            - RegexKitLite
                    -MRC
                    -添加libicucore
                    -匹配中文 \\u4e00-\\u9fa5

        -分析图文混排
            
            // 通过发送通知告知composeTextView emoticon
                -01 判断是否是emoji表情
                    - 如果是 直接显示
                    - 如果不是 需要借助富文本
                            - 创建一个文本附件
                                    - 设置image
                                    - 设置bounds
                            - 通过文本附件创建一个不可变的富文本（代表一个图片）
                            - 替换我们textView 当前的富文本 的位置的富文本
                            - 富文本 需要自己做
                                    - 隐藏占位文字
                                    - 改变右侧按钮状态
            // 发送带有图片表情的微博
                    - emoji 不用考虑
                    - 遍历textView 的富文本 
                            - 通过遍历可以拿到 结果和范围
                            - 通过结果["key"] 得到 文本附件（需要我们自定义带有emoticon属性）
                            - 文本附件的属性emticon 可以拿到chs
                            - 如果是文本附件的话 拼接chs
                            - 如果是文字的话 拼接富文本中string的指定范围的字符串
                            - 完成字符串拼接 
                            - 发送微博

            // 首页原创微博和转发微博内容图文混排
                    - 通过微博内容 生成一个可变的富文本
                    - 借助RegexKitLite 遍历微博内容 
                            - 得到 正则匹配得到结果
                            - 正则匹配到的范围
                            - 通过 正则匹配得到结果 chs 到emoticon 单例中得到他的模型
                            - 通过emticon 的path png 得到 image                  
                            - 通过文本附件 得到 不可变的富文本
                    - 通过生成一个可变的富文本 替换指定范围内的富文本
                    - 失败了 （由于我们正向遍历造成越界）
                    - 解决方式
                        - 遍历微博内容 的到结果保存到模型中 然后通过数组保存
                        - 倒序遍历数组 完成富文本指定范围内的内容替换
                    - 由于原创微博和转发微博均有微博内容
                        - 抽取方法到status中 添加一个textAttr 属性
    



        -第十四天

                - 新浪微博缓存数据库的表的字段
                    - statusid: 该微博的id, 是一个主键
                    - status: 该条微博的 JSON 数据
                    - userid: 这条微博属于哪个用户 也成为主键，区分两个用户加载回来同一条数据的情况
                        - 如果有多个帐号，都要缓存数据，那么如果不区别某些数据是属于哪个帐号的话，那么在没网的情况下去数据库加载数据的话，那么数据就会错乱
                        - 还有一个点需要注意：A 用户有一条微博的id是 1234 ，用户B 也关注了 id 为1234这条微博的作者，那么就会出现：主键相同，userid不同，解决方法就是将userid也作为主键，也就是将 statusid和userid作为复合主键

                - 新浪微博的数据库缓存可能会存在什么问题
                    - 数据不完整：如果用户在已经有一些缓存数据的情况下，关注了很多用户，但是客户端现在每次加载数据都是从本地去加载，那么，可能关注的用户的微博数据就加载不出来
                    - 数据的安全问题：比如有一个用户发了一条违规的微博，这个时候，我们在新浪没有删除这条微博之前就把这条微博给缓存到本地了，那么如果从本地去读取数据的话，就会每次把这条违规的微博加载出来
                    - 比如某条微博的转发量是1000，缓存到本地，数据可能不是最真实的



                - 不适合缓存
                    - 一些实效性比较高的数据
                    - 一些敏感度较高的数据

                - 可以缓存什么样的数据
                    - 固定变化不大的数据，并且数据的敏感度不高的数据

                    - 如果使用数据库缓存，一定要记得清理缓存


                - 清除缓存
                    - 清除缓存的操作一定不要交给用户去做
                    - SQLite的数据缓存一定要定时去清理，因为SQLite数据库，清除数据之后，数据库文件大小不会变，因为 sqlite 认为你文件能够长得这么大，那么sqlite会保留空间，以让下一次再长到这么大（这样设计是为了尽量少的文件进行扩容操作）
                    - SD会自动清除7天以上的图片数据





























































*/
